package org.ricks.ioc.cfg;

import org.ricks.ioc.utils.BooleanUtils;
import org.ricks.ioc.utils.Logger;

import java.util.Collections;
import java.util.Map;
import java.util.function.Supplier;

/**
 * 系统配置
 */
public class EnvConfigHolder {
    /**
     * 载入配置的方法
     */
    private static Supplier<Map<String, String>> loadFunction;
    /**
     * 处理过的系统配置参数...
     */
    private static Map<String, String> properties;

    private EnvConfigHolder() {
    }

    /**
     * 绑定载入配置的方法.
     *
     * @param loadFunction 载入配置的方法
     */
    public static void buildLoadFunction(Supplier<Map<String, String>> loadFunction) {
        EnvConfigHolder.loadFunction = loadFunction;
        reload();
        Logger.debug(" load properties end -- " + properties);
    }

    /**
     * 重新载入配置
     */
    public static void reload() {
        EnvConfigHolder.properties = loadFunction.get();
    }

    /**
     * 获取所有配置内容，优先级：命令行 &gt; 本地配置 &gt; 远程配置
     *
     * @return 配置内容
     */
    public static Map<String, String> getProperties() {
        return properties == null ? Collections.emptyMap() : properties;
    }

    /**
     * 根据Key值去配置中获取一个String值
     *
     * @param key Key值
     * @return String值（可能会为null）
     */
    public static String getString(String key) {
        return getProperties().get(key);
    }

    /**
     * 根据Key值去配置中获取一个Boolean值
     *
     * @param key Key值
     * @return Boolean值
     */
    public static boolean getBoolean(String key) {
        return BooleanUtils.toBoolean(getString(key));
    }

    /**
     * 根据Key值去配置中获取一个Int值
     *
     * @param key Key值
     * @return Int值
     */
    public static int getInt(String key) {
        return Integer.parseInt(getString(key));
    }
}
